package gob.inei.enaho.model.domain.ubicacion;

import gob.inei.enaho.model.domain.persona.Hogar;

import java.util.ArrayList;
import java.util.List;


/**
 *
 * @author Rdelacruz
 */
//NOTA1: Número maximo de hogares por vivienda: 5
//NOTA2: En los conglomerados Panel, no existe el concepto de reemplazos.

//Vivienda de Campo
public class Vivienda 
extends AbstractVivienda
{   
    
   
    private ViviendaMarco viviendaMarco;
    
    private String esReemplazo;//1:No es reemplazo ;2:Si es reemplazo
    
    //Esto es lo que esta la tabla de la BD
    private Vivienda viviendaReemplazada;// vivienda que reemplaza
    
    //private Vivienda viviendaReemplazo;
    private final List<Vivienda> viviendasReemplazo = new ArrayList<Vivienda>();// viviendas que la reemplazan   
      
    private List<Hogar> hogares;//hogares de campo
    
    private String telefono;
    
    private String nroHogares;
    
    public boolean tieneViviendaMarco() {
        //return viviendaMarco!=null && viviendaMarco.getCodigo()!=null;
        return viviendaMarco!=null && viviendaMarco.tieneCodigo();
    }    
    
    //-------------------------------------------------
    //          DATOS DEL REEMPLAZO
    //-------------------------------------------------
    
    public boolean esReemplazable() {
        if(hogares!=null)
            for(Hogar h: hogares) {
                if(h.suViviendaEsReemplazable())
                    return true;                
            }
        return false;
    }
    
    //No confundir con getEsReemplazo()
    public boolean esReemplazo() {    
        //Forma1:
        if(viviendaReemplazada!=null) {
            return viviendaReemplazada.tieneCodigo();
        }
        
        //Forma2: Con un campo de la BD
        return esReemplazo!=null && esReemplazo.equals("2");
    }
    
    private String getCodigoEstadoReemplazo() {
        String s  = this.getCodigo();
        if(this.getEstadoDelReemplazo().contains("OK"))
            s = s.concat("(OK)");
        return s;
    }
    
    private String getCodigosEstadoReemplazo() {
        StringBuilder sb = new StringBuilder();        
        for(Vivienda v : viviendasReemplazo) {
            sb.append(v.getCodigoEstadoReemplazo());
            sb.append(",");
        }
        sb.deleteCharAt(sb.length()-1);
        return sb.toString();
    }    
    
    public boolean tieneMasDeUnReemplazo() {
        return viviendasReemplazo.size() > 1;
    }
    
    //Verifica tamaño de "viviendasReemplazo" y si la primera vivienda tieneCodigo
    public boolean tieneReemplazo() {
        //Vivienda vr = viviendaReemplazo;
        
        //Vivienda vr = getPrimeraViviendaReemplazo();
        //return vr!=null && vr.tieneCodigo();
        return viviendasReemplazo.size()>0 && viviendasReemplazo.get(0).tieneCodigo();
    }
    
    public Vivienda getPrimeraViviendaReemplazo() {
        return !viviendasReemplazo.isEmpty() ? viviendasReemplazo.get(0) : null;
    }
    
    public void addViviendaReemplazo(Vivienda fila) {
        viviendasReemplazo.add(fila);
    }
    
    public String getEstadoDelReemplazo() {
        //verificando si existe el código de la vivienda reemplazada
        boolean bEsReemplazo = esReemplazo();
        boolean tieneReemplazo = tieneReemplazo();                               
        
        if(bEsReemplazo && getViviendaReemplazada().esReemplazo()) {            
            return "REEMPLAZO MAL TOMADO"; 
        }
        
        if(tieneReemplazo) {
            if(tieneMasDeUnReemplazo()) {
                return "REEMPLAZADA POR VARIAS: "+this.getCodigosEstadoReemplazo();
            }
            return "REEMPLAZADA POR "+this.getPrimeraViviendaReemplazo().getCodigoEstadoReemplazo();
        }
        else {        
            
            List<Hogar> listaHogares = this.getHogares();
            
            boolean tieneResultado = false;            
            for(Hogar h: listaHogares) {   
                if(h.getResultadoFinal()!=null) {           
                    tieneResultado = true;
                    break;
                }                
            }
            
            for(Hogar h: listaHogares) {              
                if(h.suViviendaEsReemplazable()) {
                    if(bEsReemplazo) {
                        return "REEMPLAZO DESCARTADO";
                    }
                    else {
                        return "FALTA REEMPLAZO";
                    }
                }
            }            
            
            if(!tieneResultado)
                return "";            
        }
        
        if(bEsReemplazo) {
            return "REEMPLAZO OK"; 
        }
        
        return "OK";        
        
    }
        
    
    //////////////////////////////////////////////////////
      
            
    public ViviendaMarco getViviendaMarco() {
        return viviendaMarco;
    }

    public void setViviendaMarco(ViviendaMarco viviendaMarco) {
        this.viviendaMarco = viviendaMarco;
    }

    public String getEsReemplazo() {
        return esReemplazo;
    }

    public void setEsReemplazo(String esReemplazo) {
        this.esReemplazo = esReemplazo;
    }

    public Vivienda getViviendaReemplazada() {
        return viviendaReemplazada;
    }

    public void setViviendaReemplazada(Vivienda viviendaReemplazada) {
        this.viviendaReemplazada = viviendaReemplazada;
    }

    /*
    public Vivienda getViviendaReemplazo() {
        return viviendaReemplazo;
    }

    public void setViviendaReemplazo(Vivienda viviendaReemplazo) {
        this.viviendaReemplazo = viviendaReemplazo;
    }
    */

    public List<Hogar> getHogares() {
        return hogares;
    }

    public void setHogares(List<Hogar> hogares) {
        this.hogares = hogares;
    }

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getNroHogares() {
		return nroHogares;
	}

	public void setNroHogares(String nroHogares) {
		this.nroHogares = nroHogares;
	}

	
    
    
}
